Оператор [frozen]
Назначение
В системах с циклической обработкой правил каждый логический узел перевычисляется на каждой итерации. Оператор [frozen] позволяет зафиксировать значение узла на заданный промежуток времени, предотвращая его пересчёт.
Как это работает
При использовании [frozen] значение узла "замораживается" — остаётся неизменным в течение указанного количества секунд, независимо от того, сколько итераций обработки правил происходит за это время.
Основные сценарии использования
- Временное хранение значений — сохранение результата вычислений на нужный период;
- Защита "медленных" операций — предотвращение повторных вызовов длительных процессов (отправка SMS, HTTP-запросы, работа с файловой системой).
Пример: отправка SMS с интервалом
В приведённом ниже правиле узел отправляет SMS-сообщение и затем "замораживается" на 30 секунд, что исключает повторную отправку до истечения этого времени:
-- Узел "N1_send_sms"
--------------------------------------
-- Отправить SMS-сообщение
N1_send_sms = { -- Создаём логический узел "N1_send_sms"
{
["load-ubus"] = function (nodes) -- Оператор [load-ubus] через системную шину
return { -- вызывает метод отправки SMS
object = "tsmodem.sms",
method = "send_sms",
params = { -- Результат:
phone = "+79051234567", -- {
text = "текст смс-сообщения" -- "status": "started",
}, -- }
}
end,
},
{
["frozen"] = function(nodes) -- В оператор [frozen] возвращается
return 30 -- время "заморозки" узла для того,
end -- чтобы на следующих итерациях узел не выполнял
} -- по-новой запрос на отправку SMS.
},
Рекомендации
Размещайте [frozen] последним в списке операторов узла. Это гарантирует, что все предшествующие операции (получение данных, преобразования, проверки) успеют выполниться до момента заморозки.